﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.Configuration;
using System.Resources;
using System.Reflection;
using System.IO;

namespace Jurassic_Island
{
    public partial class FormObjetos : Form
    {
        private DataSet dsObjetos;
        private ENObjeto enObj;
        private String exprBuscar = @"^[a-zA-Z0-9ñÑ ]*$";
        private ErrorProvider epNombre;
        private ErrorProvider epCoste;
        private bool editMode = false;
        private string exprCadena = @"^[A-Za-zñÑ]+[a-zA-ZñÑ ]*$";
        private string exprCoste = @"^[0-9]+([,][0-9]{2})?$";
        private string nombreObjeto = "";
        private OpenFileDialog opdSubirImagen;

        public FormObjetos()
        {
            InitializeComponent();
        }

        private void FormObjetos_Load(object sender, EventArgs e)
        {
            try
            {
                enObj = new ENObjeto();
                dsObjetos = new DataSet();
                ActualizarDataGrid();

                epNombre = new ErrorProvider();
                epNombre.SetIconAlignment(tbNombre, ErrorIconAlignment.MiddleRight);
                epNombre.SetIconPadding(tbNombre, 2);
                epNombre.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                epCoste = new ErrorProvider();
                epCoste.SetIconAlignment(tbCoste, ErrorIconAlignment.MiddleRight);
                epCoste.SetIconPadding(tbCoste, 2);
                epCoste.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                opdSubirImagen = new OpenFileDialog();

                if (editMode)
                {
                    tbNombre.Text = enObj.Nombre;
                    tbCoste.Text = enObj.Coste.ToString();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        private void btInsertar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidarCampos())
                {
                    dsObjetos = enObj.ObtenerListaObjetos();

                    DataRow row = dsObjetos.Tables["Objetos"].NewRow();
                    row["Nombre Objeto"] = tbNombre.Text;
                    row["Coste Objeto"] = Double.Parse(tbCoste.Text);
                    nombreObjeto = Path.GetFileName(opdSubirImagen.FileName);
                    row["Imagen Objeto"] = nombreObjeto;
                    if (nombreObjeto != "")
                        pbImagenObjeto.Image.Save(rutaImagen(nombreObjeto), System.Drawing.Imaging.ImageFormat.Jpeg);
                    dsObjetos.Tables["Objetos"].Rows.Add(row);

                    if (enObj.ActualizarObjetos(dsObjetos))
                    {
                        MessageBox.Show("Objeto insertado correctamente", "Éxito al insertar", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        ActualizarDataGrid();
                    }

                    else
                        MessageBox.Show("Error, no se ha podido insertar el objeto", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private bool ValidarCampos()
        {
            bool correcto = true;

            try
            {
                if (!Regex.Match(tbNombre.Text, exprCadena).Success)
                {

                    if (enObj.ExisteObjeto(tbNombre.Text) && editMode == false)
                    {
                        correcto = false;
                        epNombre.SetError(tbNombre, "El nombre ya existe");
                    }

                    else
                    {
                        correcto = false;
                        epNombre.SetError(tbNombre, "Introduce un nombre que contenga letras únicamente");
                    }
                }

                else
                    epNombre.SetError(tbNombre, null);

                try
                {
                    if (!Regex.Match(tbCoste.Text, exprCoste).Success)
                    {
                        correcto = false;
                        epCoste.SetError(tbCoste, "Introduce un coste numérico correcto (número real)\n");
                    }

                    else
                        epCoste.SetError(tbCoste, null);
                }
                catch (FormatException fEx)
                {
                    MessageBox.Show(fEx.Message, "Error de formato", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return correcto;
        }

        public void ActualizarDataGrid()
        {
            try
            {
                dsObjetos = enObj.ObtenerListaObjetos();
                dgvObjetos.DataSource = dsObjetos;
                dgvObjetos.DataMember = "Objetos";
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btEditar_Click(object sender, EventArgs e)
        {
            try
            {
                editMode = true;

                if (dgvObjetos.SelectedRows.Count > 0)
                {
                    tbNombre.Text = dgvObjetos["Nombre Objeto", dgvObjetos.CurrentRow.Index].Value.ToString();
                    tbCoste.Text = dgvObjetos["Coste Objeto", dgvObjetos.CurrentRow.Index].Value.ToString();
                    if (dgvObjetos["Imagen Objeto", dgvObjetos.CurrentRow.Index].Value.ToString() != "")
                    {
                        try
                        {
                            pbImagenObjeto.Image = System.Drawing.Bitmap.FromFile(rutaImagen(dgvObjetos["Imagen Objeto", dgvObjetos.CurrentRow.Index].Value.ToString()));
                        }
                        catch (Exception)
                        {
                            pbImagenObjeto.Image = null;
                        }
                    }
                    else
                        pbImagenObjeto.Image = null;
                    enObj.Nombre = tbNombre.Text;
                    enObj.Coste = double.Parse(tbCoste.Text);
                    tbAceptarEdicion.Visible = true;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btBorrar_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgvObjetos.SelectedRows.Count > 0)
                {
                    dsObjetos = enObj.ObtenerListaObjetos();

                    if (MessageBox.Show("Seguro que deseas borrar la fila seleccionada?", "Borrar lugar", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        dsObjetos.Tables["Objetos"].Rows[dgvObjetos.CurrentRow.Index].Delete();

                        if (enObj.ActualizarObjetos(dsObjetos))
                            MessageBox.Show("Objeto borrado correctamente", "Correcto", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        else
                            MessageBox.Show("Error, no se ha podido eliminar el objeto", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                     }

                    ActualizarDataGrid();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                if (Regex.Match(tbBuscar.Text,exprBuscar).Success)
                {
                    dsObjetos = enObj.BuscarListaObjetos(tbBuscar.Text);
                    dgvObjetos.DataSource = dsObjetos;
                    dgvObjetos.DataMember = "Objetos";
                    epObjetos.SetError(tbBuscar, "");
                }
                else if (tbBuscar.Text == "")
                {
                    dsObjetos = enObj.ObtenerListaObjetos();
                    dgvObjetos.DataSource = dsObjetos;
                    dgvObjetos.DataMember = "Objetos";
                    epObjetos.SetError(tbBuscar, "");
                }
                else
                {
                    epObjetos.SetError(tbBuscar, "Introduzca un texto válido.");
                    throw new Exception("Introduzca un texto válido.");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btCerrar_Click(object sender, EventArgs e)
        {
            Close();
            Dispose();
        }

        private void dgvObjetos_Resize(object sender, EventArgs e)
        {

        }

        private void FormObjetos_Resize(object sender, EventArgs e)
        {
            Refresh();
        }

        private void tbBuscar_DoubleClick(object sender, EventArgs e)
        {
            tbBuscar.Text = "";
        }

        private void tbBuscar_TextChanged(object sender, EventArgs e)
        {
            if (!Regex.IsMatch(tbBuscar.Text, exprBuscar))
            {
               epObjetos.SetError(tbBuscar, "Introduzca un texto válido.");
            }
            else
            {
               epObjetos.SetError(tbBuscar, "");
            }
        }

        private void tbNombre_TextChanged(object sender, EventArgs e)
        {
            if (Regex.Match(tbNombre.Text, exprCadena).Success)
            {
                epNombre.SetError(tbNombre, "");
            }
            else
                epNombre.SetError(tbNombre, "Nombre no válido");
        }

        private void tbAceptarEdicion_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidarCampos())
                {
                    dsObjetos = enObj.ObtenerListaObjetos();

                    int i = 0;
                    foreach (DataRow dr in dsObjetos.Tables["Objetos"].Rows)
                    {
                        if (enObj.Nombre.ToString() == dsObjetos.Tables["Objetos"].Rows[i]["Nombre Objeto"].ToString())
                        {
                            dsObjetos.Tables["Objetos"].Rows[i]["Nombre Objeto"] = tbNombre.Text;
                            dsObjetos.Tables["Objetos"].Rows[i]["Coste Objeto"] = Double.Parse(tbCoste.Text);
                            if(opdSubirImagen != null)
                                nombreObjeto = Path.GetFileName(opdSubirImagen.FileName);
                            dsObjetos.Tables["Objetos"].Rows[i]["Imagen Objeto"] = nombreObjeto;
                            if (nombreObjeto != "")
                                pbImagenObjeto.Image.Save(rutaImagen(nombreObjeto), System.Drawing.Imaging.ImageFormat.Jpeg);
                            break;
                        }

                        i++;
                    }

                    if (enObj.ActualizarObjetos(dsObjetos))
                    {
                        MessageBox.Show("Objeto editado correctamente", "Éxito al editar", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        ActualizarDataGrid();
                        tbCoste.Text = "";
                        tbNombre.Text = "";
                        tbAceptarEdicion.Visible = false;
                    }

                    else
                        MessageBox.Show("Error, no se ha podido editar el objeto", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btSubirImagen_Click(object sender, EventArgs e)
        {
            try
            {
                if(opdSubirImagen.ShowDialog() == DialogResult.OK)
                {
                    pbImagenObjeto.Image = System.Drawing.Bitmap.FromFile(opdSubirImagen.FileName);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al cargar el archivo. " + ex.Message, "Jurassic Island", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
            }

        }

        private String rutaImagen(String fichero)
        {
            //cwd: Ruta de ejecución del ejecutable windows
            string cwd = System.Reflection.Assembly.GetExecutingAssembly().Location;
            //Nombre del proyecto
            string projectName = "Jurassic Island";
            //Ruta de la solucion
            string solutionPath = cwd.Replace(projectName + @"\bin\Debug\", "");
            //Directorio de la solucion
            string SolutionDirectory = Path.GetDirectoryName(solutionPath);

            //Directorio del proyecto web
            string webPath = SolutionDirectory + @"\JurassicIslandWeb\Images\Objetos";

            return (webPath + @"\" + fichero);
        }
    }
}